#ifndef BUDGETMANAGER_H
#define BUDGETMANAGER_H

#include "Transaction.h"
#include "Budget.h"
#include <vector>
#include <map>
#include <memory>
#include <fstream>

class BudgetManager {
private:
    std::vector<std::shared_ptr<Transaction>> transactions;
    std::string dataFile;
    Budget budget;  // 预算管理器

public:
    BudgetManager(const std::string& filename = "budget_data.txt");

    // 添加收入记录
    bool addIncome(const std::string& date, double amount,
                   const std::string& category, const std::string& note);

    // 添加支出记录
    bool addExpense(const std::string& date, double amount,
                    const std::string& category, const std::string& note);

    // 显示所有记录
    void displayAllTransactions() const;

    // 按类型查询记录
    void displayByType(TransactionType type) const;

    // 按类别查询记录
    void displayByCategory(const std::string& category) const;

    // 按日期范围查询记录
    void displayByDateRange(const std::string& startDate, const std::string& endDate) const;

    // 按金额范围查询记录
    void displayByAmountRange(double minAmount, double maxAmount) const;

    // 按关键词搜索备注
    void searchByNote(const std::string& keyword) const;

    // 查看最近N条记录
    void displayRecentTransactions(int count) const;

    // 显示所有记录（按日期排序）
    void displayAllTransactionsSortedByDate(bool ascending = true) const;

    // 显示所有记录（按金额排序）
    void displayAllTransactionsSortedByAmount(bool ascending = true) const;

    // 统计总收入
    double getTotalIncome() const;

    // 统计总支出
    double getTotalExpense() const;

    // 统计净收入（收入 - 支出）
    double getNetIncome() const;

    // 按类别统计
    void displayStatisticsByCategory() const;

    // 月度统计（增强版，包含预算对比）
    void displayMonthlyStatistics(const std::string& yearMonth) const;

    // 获取指定月份的支出
    double getMonthlyExpense(const std::string& yearMonth) const;

    // 获取指定类别的支出
    double getCategoryExpense(const std::string& category) const;

    // 获取指定月份和类别的支出
    double getMonthlyExpenseByCategory(const std::string& yearMonth, const std::string& category) const;

    // 预算管理相关方法
    Budget& getBudget() { return budget; }
    const Budget& getBudget() const { return budget; }

    // 显示预算执行情况
    void displayBudgetStatus(const std::string& yearMonth) const;

    // 显示所有类别的预算执行情况
    void displayCategoryBudgetStatus() const;

    // 保存数据到文件
    bool saveToFile() const;

    // 从文件加载数据
    bool loadFromFile();

    // 获取记录总数
    size_t getTransactionCount() const { return transactions.size(); }
};

#endif
